package com.jx.mlxg.utils;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 用户订单统计响应类
 * 用于封装订单统计信息，包括总金额、订单数、产品数量及天梯图数据
 */
@Data
public class UserOrderStatisticsResponse {
    // 总金额（所有时间范围）
    private BigDecimal totalAmount;

    // 时间段内金额
    private BigDecimal periodAmount;

    // 时间段内订单数（已支付和已发货）
    private Integer periodOrderCount;

    // 时间段内产品数量统计，key为productId，value为数量
    private Map<Integer, Integer> productQuantityStats;

    // 所有产品数量总和
    private Integer totalProductQuantity;

    // 总用户数量
    private Integer totalUserCount;

    // 用户订单统计列表（天梯图数据）
    private List<UserOrderStat> userOrderStats;
    
    // 象限图数据（按时间区间统计）
    private List<TimeIntervalStat> timeIntervalStats;


    // 无参构造器
    public UserOrderStatisticsResponse() {
    }

    // 全参构造器
    public UserOrderStatisticsResponse(BigDecimal totalAmount, BigDecimal periodAmount, Integer periodOrderCount, 
                                      Map<Integer, Integer> productQuantityStats, Integer totalProductQuantity, 
                                      Integer totalUserCount, List<UserOrderStat> userOrderStats) {
        this.totalAmount = totalAmount;
        this.periodAmount = periodAmount;
        this.periodOrderCount = periodOrderCount;
        this.productQuantityStats = productQuantityStats;
        this.totalProductQuantity = totalProductQuantity;
        this.totalUserCount = totalUserCount;
        this.userOrderStats = userOrderStats;
    }

    /**
     * 用户订单统计内部类
     * 封装单个用户的订单统计信息
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UserOrderStat {
        // 用户ID
        private Long userId;

        // 用户名（格式：province-city-name-houseNumber）
        private String username;

        // 总订单数
        private Integer totalOrders;

        // 总金额
        private BigDecimal totalAmount;

        // 产品统计，key为productId，value包含产品名称和数量
        private Map<Integer, ProductStat> productStats;

        /**
         * 产品统计内部类
         * 封装单个产品的统计信息
         */
        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        public static class ProductStat {
            // 产品名称
            private String productName;

            // 产品数量
            private Integer quantity;
        }
    }
    
    /**
     * 时间区间统计内部类
     * 封装按时间区间（天/小时/月）统计的订单数据，用于象限图展示
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TimeIntervalStat {
        // 时间区间标识（如：2023-10-01，或 14:00，或 2023-10）
        private String intervalLabel;
        
        // 该时间区间内的订单总金额（已支付和已发货订单）
        private BigDecimal amount;
        
        // 该时间区间内的订单数量（已支付和已发货订单）
        private Integer orderCount;
        
        // 该时间区间内的产品数量统计，key为productId，value为数量
        private Map<Integer, Integer> productQuantityByInterval;
        
        // 该时间区间内的产品总数量
        private Integer totalProductQuantity;
    }
}
